#ifndef GENERIC_CLEANER_HPP
#define GENERIC_CLEANER_HPP

#include "visitor.hpp"

#include <string>
using namespace std;

class GenericCleaner : public Visitor {
public:
    GenericCleaner() {
    }
    
    virtual Node* visit(Node* n);
    
    virtual Node* visit(PrintNode* n) { return nullptr; }
    virtual Node* visit(ReturnNode* n) { return nullptr; }
    virtual Node* visit(BinaryOp* n) { return nullptr; }
    virtual Node* visit(LogicNotNode* n) { return nullptr; }
    virtual Node* visit(ListNode* n);
    virtual Node* visit(ConstInt* n) { return nullptr; }
    virtual Node* visit(ConstDouble* n) { return nullptr; }
    virtual Node* visit(ConstString* n) { return nullptr; }
    virtual Node* visit(ConstArray* n) { return nullptr; }
    virtual Node* visit(DotNode* n) { return nullptr; }
    virtual Node* visit(ImportNode* n) { return nullptr; }
    virtual Node* visit(ImplementNode* n) { return nullptr; }
    virtual Node* visit(IfNode* n) { return nullptr; }
    virtual Node* visit(WhileNode* n) { return nullptr; }
    virtual Node* visit(CmpNode* n) { return nullptr; }
    virtual Node* visit(AssignNode* n) { return nullptr; }
    virtual Node* visit(VarNode* n) { return nullptr; }
    virtual Node* visit(VarDefNode* n) { return nullptr; }
    virtual Node* visit(ParamDefNode* n) { return nullptr; }
    virtual Node* visit(FuncDefNode* n);
    virtual Node* visit(RecordDefNode* n) { return nullptr; }
    virtual Node* visit(StmtsNode* n);
    virtual Node* visit(SequenceNode* n) { return nullptr; }
    virtual Node* visit(TraitDefNode* n) { return nullptr; }
    virtual Node* visit(LambdaDef* n) { return nullptr; }
    virtual Node* visit(CallNode* n) { return nullptr; }
    virtual Node* visit(SubscrNode* n) { return nullptr; }
    virtual Node* visit(BuiltinConst* n) { return nullptr; }
    virtual Node* visit(TupleNode* n) { return nullptr; }
    virtual Node* visit(ArrowTypeNode* n) { return nullptr; }
    virtual Node* visit(ArrayTypeNode* n) { return nullptr; }
    virtual Node* visit(TypeTupleNode* n) { return nullptr; }
    virtual Node* visit(TypeVarNode* n) { return nullptr; }
    virtual Node* visit(TypeConstInt* n) { return nullptr; }
    virtual Node* visit(TypeFuncDefNode* n) { return nullptr; }
    virtual Node* visit(TypeVarDefNode* n) { return nullptr; }
    virtual Node* visit(TypeCallNode* n) { return nullptr; }
};

#endif